home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK2.toast / Development Kits (Disc 2) / QuickTake Digital Camera / MyQuickTakeApp 1.0.1TC7 ƒ / Sources / CmDriver.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-11  |  27.8 KB  |  954 lines  |  [TEXT/MPS ]

  1. /*------------------------------------------------------------------------------------------------
  2.     CmDriver.c        Version: 2.0 GM
  3.  
  4.     Copyright © 1994 by Apple Computer, Inc. All rights reserved.
  5.     Copyright © 1994 by Eastman Kodak Company, All rights reserved.
  6.  
  7.     Apple    Paul Hangas
  8.     Kodak    Takeshi Domen
  9.     
  10.     History
  11.      8/26/94    Version 2.0 d1 is the first release to Nimbus driver.
  12.      9/12/94    Version 2.0 d2
  13.                 Debugged SearchQuickTakeDriver function so as to judge the NULL pointer.
  14.                 CmGetPortInfo and CmConnect were modified.
  15.      9/26/94    Version 2.0 a1c1
  16.      9/28/94    Version 2.0 a1c1
  17.                 In SearchQuickTakeDriver function, the device control entry comes to be got
  18.                 by handle (Bug number NMD-AP-004). Similarly, CmOpenDriver was changed.
  19.                 In CmConnect function, incorrect locking of handle was repaired.                
  20.      9/29/94    Version 2.0 a2
  21.                  In SearchQuickTakeDriver function was added some lines as Alex-san specified.
  22.                 CmOpenDriver was added NULL judgment of DCE handle. (Bug Number NMD-AP-008).
  23.     10/28/94    Version 2.0 b1c1
  24.                 kDriverName was changed from QuickTake to QuickTake2.
  25.     11/11/94    Version 2.0 b1c2
  26.                 Improved error reporting for QuickTake™ 100 and QuickTake™ 150 drivers.
  27.                 When the QuickTake™ 100 driver is found and the QuickTake™ 150 driver is not
  28.                 found, a new error, kCmDrvrVersionError, is returned.  Needed to rewrite
  29.                 SearchQuickTakeDriver to implement this.
  30.     12/ 1/94    Version 2.0 b2
  31.     12/15/94    Version 2.0 f1c1
  32.      1/ 9/95    Version 2.0 GM
  33. ------------------------------------------------------------------------------------------------*/
  34.  
  35. #include <Types.h>
  36. #include <Files.h>
  37. #include <Devices.h>
  38. #include <Memory.h>
  39. #include <String.h>
  40. #include <Errors.h>
  41. #include <Events.h>
  42. #include "CmDriver.h"
  43.  
  44. /*    **WARNING**    Note direct reference to low memory global!    */
  45. #ifndef LMGetUnitTableCount
  46. #define LMGetUnitTableCount() (*(short *) 0x1D2)
  47. #endif
  48.  
  49. #define kStartUnitNum 48        /*    Beginning of non-reserved unit numbers.    */
  50. #define kDriverNameOffset 18    /*    Offset in driver to driver name.    */
  51.  
  52. #ifndef dRAMBased
  53. #define dRAMBased 6
  54. #endif
  55.  
  56. #define kQTake100DrvrName        "\p.QuickTake"
  57. #define kQTake150DrvrName        "\p.QuickTake2"            // Changed 10/24/94 by Domen
  58.  
  59. //--------------------------------------------------------------------------------------------------
  60. typedef    unsigned long    ulong;
  61. typedef    unsigned char    uchar;
  62. typedef    unsigned short    ushort;
  63. //--------------------------------------------------------------------------------------------------
  64.  
  65. // CSCode
  66. #define        CS_OPEN                30
  67. #define        CS_INQUIRY            31
  68. #define        CS_REZERO_UNIT        32
  69. #define        CS_SCAN                33
  70. #define        CS_SEND_DIAGNOSTICS    34
  71. #define        CS_CAMERA_INFO        35
  72. #define        CS_THUMB_INFO        36
  73. #define        CS_FULL_INFO        37
  74. #define        CS_DATE_TIME        38
  75. #define        CS_CAMERA_ID        39
  76. #define        CS_BAUD_RATE        40
  77. #define        CS_COMP_MODE        41
  78. #define        CS_PICTURE_MODE        42
  79. #define        CS_FLASH_MODE        43
  80. #define        CS_TIMEOUT            44
  81. #define        CS_UNIT_READY        45
  82. #define        CS_ERASE            46
  83. #define        CS_GETPORTINF        47
  84. #define        CS_CONNECT            48
  85. #define        CS_DISCONNECT        49
  86. #define     CS_REQUEST          50
  87. #define        CS_COMP_INFO        51
  88. #define        CS_MATRIX_INFO        52
  89. #define        CS_GETSTDFEATURES    102
  90. #define        CS_SLEEPDELAY        55
  91.  
  92. pascal short SearchQuickTakeDriver(Boolean *QTake150DrvrFound, Boolean *QTake100DrvrFound);
  93. pascal short CheckCameraData(CameraData cameraData);
  94. static Boolean StringsEqual(Str255 a, Str255 b);
  95. //**************************************************************************************************
  96. // CmOpenDriver
  97. //
  98. // Open the Camera Driver.  Driver memory is allocated and High Speed Serial code is loaded.
  99. //--------------------------------------------------------------------------------------------------
  100. pascal OSErr CmOpenDriver(CameraDataPtr cameraData)
  101. {
  102.     OSErr            err;
  103.     short            QuickTakeRefNum;
  104.     DCtlHandle        dce;
  105.     Boolean            QTake150DrvrFound, QTake100DrvrFound;
  106.     
  107.     QuickTakeRefNum = SearchQuickTakeDriver(&QTake150DrvrFound, &QTake100DrvrFound); // Verify QuickTake™ driver is really installed.
  108.     
  109.     if ((!QTake150DrvrFound) && (QTake100DrvrFound) )  //11/10/94  added by Alex P
  110.         return (kCmDrvrVersionError);
  111.         
  112.     if (QuickTakeRefNum == 0)
  113.         return(kCmDriverNotLoadedError);
  114.     
  115.     dce = GetDCtlEntry(QuickTakeRefNum);
  116.  
  117.     if (!dce)                                // 10/7/94 Added by Domen
  118.         return(kCmDriverNotLoadedError);
  119.  
  120.     if ((*dce)->dCtlFlags & 0x20)
  121.         return(kCmAlreadyOpenError);
  122.  
  123.     if ((*cameraData = (CameraData)NewPtrClear( sizeof(CmCameraData) )) == NULL)
  124.         return(kCmNoMemoryError);
  125.  
  126.     (*cameraData)->currentA5 = SetCurrentA5();
  127.  
  128.     (*cameraData)->paramBlock.ioParam.ioNamePtr = kQTake150DrvrName;
  129.     (*cameraData)->paramBlock.ioParam.ioPermssn = fsRdWrPerm;
  130.  
  131.     err = PBOpen(&(*cameraData)->paramBlock, false);
  132.  
  133.     if (err != noErr) {
  134.         DisposePtr((Ptr)*cameraData);
  135.         *cameraData = NULL;
  136.     }
  137.     return(err);
  138. }
  139.  
  140. //**************************************************************************************************
  141. // CmCloseDriver
  142. //
  143. // Close the Camera Driver.  Driver memory is disposed and High Speed Serial code is disposed.
  144. //--------------------------------------------------------------------------------------------------
  145. pascal OSErr CmCloseDriver(CameraData cameraData)
  146. {
  147.     OSErr           err;
  148.     ParamBlockRec    pb;
  149.     
  150.     if ((err = CheckCameraData(cameraData)) != noErr)
  151.         return (err);
  152.  
  153.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  154.  
  155.     if (cameraData->connectedFlag == true)
  156.         return (kCmCurrentlyConnectedError);
  157.  
  158.     err = PBClose(&cameraData->paramBlock, false);
  159.  
  160.     if (err == noErr) {
  161.         DisposePtr((Ptr)cameraData);
  162.     }
  163.  
  164.     return(err);
  165. }
  166.  
  167. //**************************************************************************************************
  168. // CmGetStdFeatures
  169. //
  170. // Retrieve the standard features of the camera (whose data is known by QuickTake™ Driver)
  171. // in context.
  172. //--------------------------------------------------------------------------------------------------
  173. pascal OSErr CmGetStdFeatures(CameraData cameraData,
  174.                               CmStdFeaturesPtr stdFeaturesPtr,
  175.                               short length)
  176. {
  177.     OSErr            err;
  178.     ParamBlockRec    pb;
  179.  
  180.     if ((err = CheckCameraData(cameraData)) != noErr)
  181.         return (err);
  182.  
  183.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  184.  
  185.     pb.cntrlParam.csCode = CS_GETSTDFEATURES;
  186.     *((CmStdFeatures **)(&pb.cntrlParam.csParam[0])) = stdFeaturesPtr;
  187.     pb.cntrlParam.csParam[2] = length;
  188.  
  189.     err = PBStatus(&pb, false);
  190.  
  191.     return(err);
  192.  
  193. }
  194.  
  195. //**************************************************************************************************
  196. // CmGetPortInfo
  197. //
  198. // Get the Port information.
  199. //--------------------------------------------------------------------------------------------------
  200. pascal OSErr CmGetPortInfo(CameraData cameraData,
  201.                            unsigned long index,
  202.                            CmPortInfoHandlePtr portInfoHandle)
  203. {
  204.     OSErr            err;
  205.     ParamBlockRec    pb;
  206.  
  207.     if ((err = CheckCameraData(cameraData)) != noErr)
  208.         return (err);
  209.  
  210.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  211.  
  212.     pb.cntrlParam.csCode = CS_GETPORTINF;
  213.  
  214.     *((unsigned long*)(&pb.cntrlParam.csParam[0])) = index;
  215.     *portInfoHandle = (CmPortInfoHandle)NewHandleClear( sizeof(CmPortInfo) );
  216.     if (*portInfoHandle == NULL)
  217.         return(kCmNoMemoryError);
  218.  
  219.     HLock((Handle)*portInfoHandle);// 9/12/94 Domen
  220.  
  221.     *((CmPortInfoPtr*)(&pb.cntrlParam.csParam[2])) = **portInfoHandle;
  222.  
  223.     err = PBControl(&pb, false);
  224.  
  225.     HUnlock((Handle)*portInfoHandle);// 9/12/94 Domen
  226.  
  227.     if (err != noErr) {
  228.         DisposeHandle((Handle)*portInfoHandle);
  229.         *portInfoHandle = NULL;
  230.     }
  231.     return(err);
  232. }
  233.  
  234. //**************************************************************************************************
  235. // CmDisposePortInfo
  236. //
  237. // Frees the CmPortInfo structure previously allocated by CmGetPortInfo.
  238. //--------------------------------------------------------------------------------------------------
  239. pascal OSErr CmDisposePortInfo(CameraData cameraData,
  240.                                CmPortInfoHandle portInfoHandle)
  241. {
  242.     OSErr           err;
  243.     Handle            tempH;
  244.  
  245.     if ((err = CheckCameraData(cameraData)) != noErr)
  246.         return (err);
  247.  
  248.     if (GetHandleSize((Handle)portInfoHandle) != sizeof(CmPortInfo))
  249.         return(kCmBadArgError);
  250.  
  251.     HLock((Handle)portInfoHandle);
  252.  
  253.     tempH = (*portInfoHandle)->portIcon;
  254.     if (tempH) DisposeHandle(tempH);
  255.  
  256.     tempH = (Handle)(*portInfoHandle)->portName;
  257.     if (tempH) DisposeHandle(tempH);
  258.  
  259.     tempH = (Handle)(*portInfoHandle)->appName;
  260.     if (tempH) DisposeHandle(tempH);
  261.  
  262.     tempH = (*portInfoHandle)->portConfig;
  263.     if (tempH) DisposeHandle(tempH);
  264.  
  265.     HUnlock((Handle)portInfoHandle);
  266.  
  267.     DisposeHandle((Handle)portInfoHandle);
  268.     
  269.     return(noErr);
  270. }
  271.  
  272. //**************************************************************************************************
  273. // CmConnect
  274. //
  275. // Open a connection to the camera.
  276. //--------------------------------------------------------------------------------------------------
  277. pascal OSErr CmConnect(CameraData cameraData,
  278.                        CmPortInfoHandle portInfoHandle)
  279. {
  280.     OSErr           err;
  281.     ParamBlockRec    pb;
  282.     char            state;
  283.  
  284.     if ((err = CheckCameraData(cameraData)) != noErr)
  285.         return (err);
  286.  
  287.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  288.  
  289.     if (GetHandleSize((Handle)portInfoHandle) != sizeof(CmPortInfo))
  290.         return(kCmBadArgError);
  291.  
  292.     pb.cntrlParam.csCode = CS_CONNECT;
  293.  
  294.     state = HGetState((Handle)portInfoHandle);// 9/12/94 Domen
  295.  
  296.     HLock((Handle)portInfoHandle);// 9/28/94 Domen
  297.  
  298.     *((CmPortInfo**)(&pb.cntrlParam.csParam[0])) = *portInfoHandle;
  299.  
  300.     err = PBControl(&pb, false);
  301.  
  302.     HSetState((Handle)portInfoHandle,state);// 9/12/94 Domen
  303.  
  304.     if (err == noErr)
  305.         cameraData->connectedFlag = true;
  306.  
  307.     return(err);
  308. }
  309.  
  310. //**************************************************************************************************
  311. // CmDisconnect
  312. //
  313. // Close the connection to the camera.
  314. //--------------------------------------------------------------------------------------------------
  315. pascal OSErr CmDisconnect(CameraData cameraData)
  316. {
  317.     OSErr           err;
  318.     ParamBlockRec    pb;
  319.  
  320.     if (cameraData == NULL) return(kCmBadArgError);
  321.  
  322.     if (GetPtrSize((Ptr)cameraData) != sizeof(CmCameraData))
  323.         return(kCmBadArgError);
  324.  
  325.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  326.  
  327.     if (cameraData->paramBlock.cntrlParam.ioResult == 1) {
  328.         PBKillIO(&pb, false);
  329.     }
  330.  
  331.     if (cameraData->connectedFlag == false)
  332.         return (kCmNotConnectedError);
  333.  
  334.     pb.cntrlParam.csCode = CS_DISCONNECT;
  335.  
  336.     err = PBControl(&pb, false);
  337.     
  338.     if (err == noErr)
  339.         cameraData->connectedFlag = false;
  340.  
  341.     return(err);
  342. }
  343.  
  344. //**************************************************************************************************
  345. // CmCheckIfReady
  346. //
  347. // Check if the camera is ready for commands. 
  348. //--------------------------------------------------------------------------------------------------
  349. pascal OSErr CmCheckIfReady(CameraData cameraData)
  350. {
  351.     OSErr           err;
  352.     ParamBlockRec    pb;
  353.  
  354.     if ((err = CheckCameraData(cameraData)) != noErr)
  355.         return (err);
  356.  
  357.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  358.  
  359.     pb.cntrlParam.csCode = CS_UNIT_READY;
  360.  
  361.     err = PBControl(&pb, false);
  362.  
  363.     return(err);
  364. }
  365.  
  366. //**************************************************************************************************
  367. // CmRestoreDefaults
  368. //
  369. // Revert some of the characteristics of the camera to their factory settings.
  370. //--------------------------------------------------------------------------------------------------
  371. pascal OSErr CmRestoreDefaults(CameraData cameraData)
  372. {
  373.     OSErr           err;
  374.     ParamBlockRec    pb;
  375.  
  376.     if ((err = CheckCameraData(cameraData)) != noErr)
  377.         return (err);
  378.  
  379.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  380.  
  381.     pb.cntrlParam.csCode = CS_REZERO_UNIT;
  382.  
  383.     err = PBControl(&pb, false);
  384.  
  385.     return(err);
  386. }
  387.  
  388. //**************************************************************************************************
  389. // CmGetErrorInfo
  390. //
  391. // Get the detailed error information from the camera, on an error encountered by the last
  392. // command sent to the camera.
  393. //--------------------------------------------------------------------------------------------------
  394. pascal OSErr CmGetErrorInfo(CameraData cameraData,
  395.                             shortPtr category,
  396.                             shortPtr diagnosticsCode) 
  397. {
  398.     OSErr           err;
  399.     ParamBlockRec    pb;
  400.  
  401.     if ((err = CheckCameraData(cameraData)) != noErr)
  402.         return (err);
  403.  
  404.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  405.  
  406.     pb.cntrlParam.csCode = CS_REQUEST;
  407.  
  408.     *((short **)(&pb.cntrlParam.csParam[0])) = category;
  409.     *((short **)(&pb.cntrlParam.csParam[2])) = diagnosticsCode;
  410.  
  411.     err = PBStatus(&pb, false);
  412.  
  413.     return(err);
  414. }
  415.  
  416. //**************************************************************************************************
  417. // CmGetProductInfo
  418. //
  419. // Get the product specific information related to the camera in context.
  420. //--------------------------------------------------------------------------------------------------
  421. pascal OSErr CmGetProductInfo(CameraData cameraData,
  422.                               CmProductInfoPtr productInfo)
  423. {
  424.     OSErr           err;
  425.     ParamBlockRec    pb;
  426.  
  427.     if ((err = CheckCameraData(cameraData)) != noErr)
  428.         return (err);
  429.  
  430.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  431.     pb.cntrlParam.csCode = CS_INQUIRY;
  432.     *((CmProductInfoPtr*)(&pb.cntrlParam.csParam[0])) = productInfo;
  433.  
  434.     err = PBControl(&pb, false);
  435.  
  436.     return(err);
  437. }
  438.  
  439. //**************************************************************************************************
  440. // CmTakePicture
  441. //
  442. // Send the signal to the camera, which let it take a picture.
  443. //--------------------------------------------------------------------------------------------------
  444. pascal OSErr CmTakePicture(CameraData cameraData,
  445.                            Boolean timerOn)
  446. {
  447.     OSErr           err;
  448.     ParamBlockRec    pb;
  449.  
  450.     if ((err = CheckCameraData(cameraData)) != noErr)
  451.         return (err);
  452.  
  453.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  454.  
  455.     pb.cntrlParam.csCode = CS_SCAN;
  456.  
  457.     *((Boolean*)(&pb.cntrlParam.csParam[0])) = timerOn;
  458.  
  459.     err = PBControl(&pb, false);
  460.  
  461.     return(err);
  462. }
  463.  
  464. //**************************************************************************************************
  465. // CmSelfTest
  466. //
  467. // Trigger the diagnostics test built into the camera.
  468. //--------------------------------------------------------------------------------------------------
  469. pascal OSErr CmSelfTest(CameraData cameraData)
  470. {
  471.     OSErr           err;
  472.     ParamBlockRec    pb;
  473.  
  474.     if ((err = CheckCameraData(cameraData)) != noErr)
  475.         return (err);
  476.  
  477.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  478.  
  479.     pb.cntrlParam.csCode = CS_SEND_DIAGNOSTICS;
  480.  
  481.     err = PBControl(&pb, false);
  482.  
  483.     return(err);
  484. }
  485.  
  486. //**************************************************************************************************
  487. // CmGetCameraInfo
  488. //
  489. // Retrieve information related to the camera in context.
  490. //--------------------------------------------------------------------------------------------------
  491. pascal OSErr CmGetCameraInfo(CameraData cameraData,
  492.                              CmCameraInfoPtr cameraInfo)
  493. {
  494.     OSErr           err;
  495.     ParamBlockRec    pb;
  496.  
  497.     if ((err = CheckCameraData(cameraData)) != noErr)
  498.         return (err);
  499.  
  500.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  501.  
  502.     pb.cntrlParam.csCode = CS_CAMERA_INFO;
  503.     *((CmCameraInfoPtr*)(&pb.cntrlParam.csParam[0])) = cameraInfo;
  504.  
  505.     err = PBControl(&pb, false);
  506.  
  507.     return(err);
  508. }
  509.  
  510. //**************************************************************************************************
  511. // CmGetPictureInfo
  512. //
  513. // Retrieve information related to a particular picture stored in the camera.
  514. //--------------------------------------------------------------------------------------------------
  515. pascal OSErr CmGetPictureInfo(CameraData cameraData,
  516.                               unsigned short pictureNo,
  517.                               CmPictureInfoPtr pictureInfo)
  518. {
  519.     OSErr           err;
  520.     ParamBlockRec    pb;
  521.  
  522.     if ((err = CheckCameraData(cameraData)) != noErr)
  523.         return (err);
  524.  
  525.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  526.  
  527.     pb.cntrlParam.csCode = CS_FULL_INFO;
  528.     *((CmPictureInfoPtr*)(&pb.cntrlParam.csParam[0])) = pictureInfo;
  529.     pb.cntrlParam.csParam[2] = pictureNo;
  530.  
  531.     err = PBControl(&pb, false);
  532.  
  533.     return(err);
  534. }
  535.  
  536. //**************************************************************************************************
  537. // CmGetThumbnailImage
  538. //
  539. // Retrieve the thumbnail version of the image of a particular picture.
  540. //--------------------------------------------------------------------------------------------------
  541. pascal OSErr CmGetThumbnailImage(CameraData cameraData,
  542.                                  unsigned short pictureNo,
  543.                                  BufferPtr thumbnailBuffer,
  544.                                  unsigned long numberOfBytesToRead,
  545.                                  Boolean firstRead,
  546.                                  LongPtr actualBytes)  /* the number of bytes actually read */
  547. {
  548.     OSErr            err;
  549.     ParamBlockRec    pb;
  550.  
  551.     if ((err = CheckCameraData(cameraData)) != noErr)
  552.         return (err);
  553.  
  554.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  555.  
  556.     thumbnailBuffer[0] = 0;
  557.     *((unsigned short*)(&thumbnailBuffer[1])) = pictureNo;
  558.     *((Boolean*)(&thumbnailBuffer[5])) = firstRead;
  559.  
  560.     pb.ioParam.ioBuffer = (Ptr)thumbnailBuffer;
  561.       pb.ioParam.ioReqCount = numberOfBytesToRead;
  562.  
  563.     err = PBRead(&pb, false);
  564.  
  565.     *actualBytes = pb.ioParam.ioActCount;
  566.  
  567.     return(err);
  568. }
  569.  
  570. //**************************************************************************************************
  571. // CmGetFullSizeIamge
  572. //
  573. // Retrieve the fullsize version of the image of a particular picture.
  574. //--------------------------------------------------------------------------------------------------
  575. pascal OSErr CmGetFullSizeImage(CameraData cameraData,
  576.                                 unsigned short pictureNo,
  577.                                 BufferPtr fullsizeBuffer,
  578.                                 unsigned long numberOfBytesToRead,
  579.                                 Boolean firstRead,
  580.                                 LongPtr actualBytes)    /* the number of bytes actually read */
  581. {
  582.     OSErr           err;
  583.     ParamBlockRec    pb;    
  584.  
  585.     if ((err = CheckCameraData(cameraData)) != noErr)
  586.         return (err);
  587.  
  588.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  589.  
  590.     fullsizeBuffer[0] = 1;
  591.     *(unsigned short *)(&fullsizeBuffer[1]) = pictureNo;
  592.     *((Boolean*)(&fullsizeBuffer[5])) = firstRead;
  593.  
  594.     pb.ioParam.ioBuffer = (Ptr)fullsizeBuffer;
  595.     pb.ioParam.ioReqCount = numberOfBytesToRead;
  596.   
  597.     err = PBRead(&pb, false);
  598.  
  599.     *actualBytes = pb.ioParam.ioActCount;
  600.  
  601.     return(err);
  602. }
  603.  
  604. //**************************************************************************************************
  605. // CmErase
  606. //
  607. // Erase the pictures in the camera.
  608. //--------------------------------------------------------------------------------------------------
  609. pascal OSErr CmErase(CameraData cameraData)
  610. {
  611.     OSErr           err;
  612.     ParamBlockRec    pb;
  613.  
  614.     if ((err = CheckCameraData(cameraData)) != noErr)
  615.         return (err);
  616.  
  617.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  618.  
  619.     pb.cntrlParam.csCode = CS_ERASE;
  620.  
  621.     err = PBControl(&pb, false);
  622.  
  623.     return(err);
  624. }
  625.  
  626. //**************************************************************************************************
  627. // CmSetDateAndTime
  628. //
  629. // Set the date and time of the camera.
  630. //--------------------------------------------------------------------------------------------------
  631. pascal OSErr CmSetDateAndTime(CameraData cameraData,
  632.                               CmDateAndTimePtr dateAndTime)
  633. {
  634.     OSErr           err;
  635.     ParamBlockRec    pb;
  636.  
  637.     if ((err = CheckCameraData(cameraData)) != noErr)
  638.         return (err);
  639.  
  640.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  641.  
  642.     pb.cntrlParam.csCode = CS_DATE_TIME;
  643.     *((CmDateAndTime **)(&pb.cntrlParam.csParam[0])) = dateAndTime;
  644.  
  645.     err = PBControl(&pb, false);
  646.  
  647.     return(err);
  648. }
  649.  
  650. //**************************************************************************************************
  651. // CmSetOwnerName
  652. //
  653. // Alter the identification of the camera.
  654. //--------------------------------------------------------------------------------------------------
  655. pascal OSErr CmSetOwnerName(CameraData cameraData,
  656.                             BufferPtr ownerName)
  657. {
  658.     OSErr           err;
  659.     ParamBlockRec    pb;
  660.  
  661.     if ((err = CheckCameraData(cameraData)) != noErr)
  662.         return (err);
  663.  
  664.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  665.  
  666.     pb.cntrlParam.csCode = CS_CAMERA_ID;
  667.     *((BufferPtr*)(&pb.cntrlParam.csParam[0])) = ownerName;
  668.  
  669.     err = PBControl(&pb, false);
  670.  
  671.     return(err);
  672. }
  673.  
  674. //**************************************************************************************************
  675. // CmSetPictureMode
  676. //
  677. // Alter the picture mode of the camera.
  678. //--------------------------------------------------------------------------------------------------
  679. pascal OSErr CmSetPictureMode(CameraData cameraData,
  680.                               unsigned char pictureMode)
  681. {
  682.     OSErr           err;
  683.     ParamBlockRec    pb;
  684.  
  685.     if ((err = CheckCameraData(cameraData)) != noErr)
  686.         return (err);
  687.  
  688.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  689.  
  690.     pb.cntrlParam.csCode = CS_PICTURE_MODE;
  691.     *((unsigned char*)(&pb.cntrlParam.csParam[0])) = pictureMode;
  692.  
  693.     err = PBControl(&pb, false);
  694.  
  695.     return(err);
  696. }
  697.  
  698. //**************************************************************************************************
  699. // CmSetFlashMode
  700. //
  701. // Set the flash mode in the camera.
  702. //--------------------------------------------------------------------------------------------------
  703. pascal OSErr CmSetFlashMode(CameraData cameraData,
  704.                             unsigned char flashMode)
  705. {
  706.     OSErr           err;
  707.     ParamBlockRec    pb;    
  708.  
  709.     if ((err = CheckCameraData(cameraData)) != noErr)
  710.         return (err);
  711.  
  712.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  713.  
  714.     pb.cntrlParam.csCode = CS_FLASH_MODE;
  715.     *((unsigned char*)(&pb.cntrlParam.csParam[0])) = flashMode;
  716.  
  717.     err = PBControl(&pb, false);
  718.  
  719.     return(err);
  720. }
  721.  
  722. //**************************************************************************************************
  723. // CmTakePictureAsync
  724. //
  725. // Send the signal to the camera, which let it take a picture.
  726. //--------------------------------------------------------------------------------------------------
  727. pascal OSErr CmTakePictureAsync(CameraData cameraData,
  728.                                 Boolean timerOn,
  729.                                 CmAsyncCompletionRoutinePtr CmAsyncCompletionRoutine)
  730. {
  731.     OSErr           err;
  732.  
  733.     if ((err = CheckCameraData(cameraData)) != noErr)
  734.         return (err);
  735.     
  736.     cameraData->paramBlock.cntrlParam.ioCompletion = (IOCompletionUPP) CmAsyncCompletionRoutine;
  737.     cameraData->paramBlock.cntrlParam.csCode = CS_SCAN;
  738.     *((Boolean *)(&cameraData->paramBlock.cntrlParam.csParam[0])) = timerOn;
  739.  
  740.     err = PBControl(&(cameraData->paramBlock),true);
  741.  
  742.     return(err);
  743. }
  744.  
  745. //**************************************************************************************************
  746. // CmEraseAsync
  747. //
  748. // Erase the pictures in the camera.
  749. //--------------------------------------------------------------------------------------------------
  750. pascal OSErr CmEraseAsync(CameraData cameraData,
  751.                           CmAsyncCompletionRoutinePtr CmAsyncCompletionRoutine)
  752. {
  753.     OSErr           err;
  754.  
  755.     if ((err = CheckCameraData(cameraData)) != noErr)
  756.         return (err);
  757.  
  758.     cameraData->paramBlock.cntrlParam.ioCompletion = (IOCompletionUPP)CmAsyncCompletionRoutine;
  759.     cameraData->paramBlock.cntrlParam.csCode = CS_ERASE;
  760.  
  761.     err = PBControl(&(cameraData->paramBlock), true);
  762.  
  763.     return(err);
  764. }
  765.  
  766. //**************************************************************************************************
  767. // CmGetDecompTable
  768. //
  769. // Get the data compression/decompression table
  770. //--------------------------------------------------------------------------------------------------
  771. pascal OSErr CmGetDecompTable(CameraData cameraData,
  772.                               BufferPtr ipmInfo)
  773. {
  774.     OSErr            err;
  775.     ParamBlockRec    pb;
  776.  
  777.     if ((err = CheckCameraData(cameraData)) != noErr)
  778.         return (err);
  779.  
  780.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  781.  
  782.     pb.cntrlParam.csCode = CS_COMP_INFO;
  783.     *((BufferPtr*)(&pb.cntrlParam.csParam[0])) = ipmInfo;
  784.  
  785.     err = PBControl(&pb, false);
  786.  
  787.     return(err);
  788. }
  789.  
  790. //**************************************************************************************************
  791. // CmGetColorCorrectionMatrix
  792. //
  793. // Get the camera color correction matrix
  794. //--------------------------------------------------------------------------------------------------
  795. pascal OSErr CmGetColorCorrectionMatrix(CameraData cameraData,
  796.                                         CmColorMatrixPtr colorMatrix)
  797. {
  798.     OSErr            err;
  799.     ParamBlockRec    pb;
  800.  
  801.     if ((err = CheckCameraData(cameraData)) != noErr)
  802.         return (err);
  803.  
  804.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  805.  
  806.     pb.cntrlParam.csCode = CS_MATRIX_INFO;
  807.     *((CmColorMatrixPtr*)(&pb.cntrlParam.csParam[0])) = colorMatrix;
  808.  
  809.     err = PBControl(&pb, false);
  810.  
  811.     return(err);
  812. }
  813.  
  814. //**************************************************************************************************
  815. // CmSetSleep
  816. //
  817. // Set the sleep delay (while connected to a computer) of the camera
  818. //--------------------------------------------------------------------------------------------------
  819. pascal OSErr CmSetSleep(CameraData cameraData,
  820.                         short sleepDelay)
  821. {
  822.     OSErr           err;
  823.     ParamBlockRec    pb;
  824.  
  825.     if ((err = CheckCameraData(cameraData)) != noErr)
  826.         return (err);
  827.  
  828.     pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
  829.  
  830.     pb.cntrlParam.csCode = CS_SLEEPDELAY;
  831.     pb.cntrlParam.csParam[0] = sleepDelay;
  832.  
  833.     err = PBControl(&pb, false);
  834.  
  835.     return(err);
  836. }
  837.  
  838. //**************************************************************************************************
  839. // SearchQuickTakeDriver
  840. // This function is local one to search the reference number of QuickTake™ Camera driver. 
  841. // If the QuickTake™ Camera driver can be found, return the reference number.
  842. // Otherwise, return zero.
  843. //--------------------------------------------------------------------------------------------------
  844. pascal short SearchQuickTakeDriver(Boolean *QTake150DrvrFound, Boolean *QTake100DrvrFound)
  845. {
  846.     DCtlHandle    curDCtlEntry;
  847.     Ptr    curDrvrPtr;
  848.     short    unitNum;
  849.     short    unitTableCount;    
  850.     short    refNum = 0;
  851.  
  852.     *QTake100DrvrFound = false;
  853.     *QTake150DrvrFound = false;
  854.     unitTableCount = LMGetUnitTableCount();
  855.     
  856.     /*    Walk through non-reserved entries in the Unit Table.  We assume at least 48    */
  857.     /*    available entries as we are running on at least a Mac II or later.            */
  858.     for (unitNum = kStartUnitNum; unitNum < unitTableCount; ++unitNum)
  859.     {
  860.         curDCtlEntry = GetDCtlEntry(~unitNum);
  861.         
  862.         if (curDCtlEntry != nil)
  863.         {
  864.             /*    If RAM bit set, it's a handle. Otherwise it's a pointer.    */
  865.             if ((**curDCtlEntry).dCtlFlags & (1 << dRAMBased))
  866.             {
  867.                 /*    Dereference for handle based driver.    */
  868.                 curDrvrPtr = *((Handle)(**curDCtlEntry).dCtlDriver);
  869.             }
  870.             else
  871.             {
  872.                 curDrvrPtr = (**curDCtlEntry).dCtlDriver;
  873.             }
  874.             
  875.             if (curDrvrPtr != nil)
  876.             {
  877.                 /*    Does the driver name match?    */
  878.                 if (StringsEqual(kQTake150DrvrName, (unsigned char *)(curDrvrPtr + kDriverNameOffset)))
  879.                 {
  880.                     /*    Found QuickTake™ Camera 2.0.  Save the refNum and exit our search loop.    */
  881.                     *QTake150DrvrFound = true;
  882.                     refNum = ~unitNum;
  883.                     break;
  884.                 }                                        //11/10/94  added by Alex P
  885.                 else if ((!(*QTake100DrvrFound)) && (StringsEqual(kQTake100DrvrName, (unsigned char *)(curDrvrPtr + kDriverNameOffset))))
  886.                     /*    Found QuickTake™ Camera 1.0; continue looking for the 2.0 version*/
  887.                     *QTake100DrvrFound = true;          
  888.             }
  889.         }
  890.     }
  891.     
  892.     return (refNum);
  893. }
  894.  
  895. /***************************************************************************************************
  896. //    StringsEqual
  897. //    Simple counted (Pascal) string compare.
  898. //
  899. //    Returns true if all bits in the strings are equal OR
  900. //    if both parameters (a and b) are NULL.
  901. //    If only one of the parameters (a or b) is NULL,
  902. //    we assume an invalid parameter and return false.
  903. //------------------------------------------------------------------------------------------------*/
  904. static Boolean StringsEqual(Str255 a, Str255 b)
  905. {
  906.     Boolean    result = true;    /*    Assume strings equal.    */
  907.     short    count;
  908.  
  909.  
  910.     if (a != b)
  911.     {
  912.         if ((a != NULL) && (b != NULL))
  913.         {
  914.             count = (short)(*(unsigned char *)a);
  915.         
  916.             do
  917.             {
  918.                 if (*a++ != *b++)
  919.                 {
  920.                     result = false;
  921.                     break;
  922.                 }
  923.             } while (count-- > 0);
  924.         }
  925.         else
  926.         {
  927.             result = false;
  928.         }
  929.     }
  930.     
  931.     return (result);
  932. }
  933.  
  934. //**************************************************************************************************
  935. // CheckCameraData
  936. // This function is local one to check camera data. 
  937. // This returns next:
  938. //        noErr
  939. //        kCmBadArgError
  940. //        kCmAIPError
  941. //--------------------------------------------------------------------------------------------------
  942. pascal short CheckCameraData(CameraData cameraData)
  943. {
  944.     if (cameraData == NULL) return(kCmBadArgError);
  945.  
  946.     if (GetPtrSize((Ptr)cameraData) != sizeof(CmCameraData))
  947.         return(kCmBadArgError);
  948.  
  949.     if (cameraData->paramBlock.cntrlParam.ioResult == 1)
  950.         return(kCmAIPError);
  951.  
  952.     return(noErr);
  953. }
  954.